package com.niit.session12;

public class TestAnimal {
	public static void main(String[] args) {
		TestAnimal testAnimal = new TestAnimal();
//		多态前提3：父类的引用指向子类的对象
//		类型的向上转换
		Animal animal = new Dog();
//		多态里访问变量：编译看左边，运行也看左边
		System.out.println(animal.name);
//		多态里方法的调用：编译看左边，运行看右边
		animal.yelling();
//		animal.watchHouse();
		int a = 1000000;
//		把取值范围小的变量赋值给取值范围大的会自动进行类型转换
		long b = a;
//		如果要强行转换会导致精度丢失
		byte c = (byte) b;
		System.out.println(c);
//		如果要把父类的变量变成子类，也需要进行强转
//		强转之前，需要先判断这个变量里的实例到底是猫是狗，用到instanceof关键字
		if(animal instanceof Dog) {
			Dog dog = (Dog) animal;
			dog.watchHouse();
		}else {
			System.out.println("变量里装的不是狗，无法强转");
		}
	}
}

class Animal{
	String name = "动物";
	public void yelling() {
		System.out.println("动物发出了不可描述的声音~");
	}
}

class Dog extends Animal{
	String name = "旺财";
	@Override
	public void yelling() {
		System.out.println("汪汪~");
	}
//	多态的缺陷：无法直接调用子类里特有的方法
	public void watchHouse() {
		System.out.println("看家");
	}
}

//多态前提1：有继承关系
class Cat extends Animal{
	String name = "小花";
//	多态前提2：有方法重写
	@Override
	public void yelling() {
		System.out.println("喵~");
	}
}


